package top.lshaci.learning.activiti.day1;

import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.DeploymentBuilder;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test;
import top.lshaci.learning.activiti.util.ProcessEngineSingleton;

import java.util.List;

/**
 * HelloWorld
 * 初步了解操作 activiti 做事的步骤
 * API使用步骤：
 * 1、创建核心对象
 * 2、根据需要，获得对应的服务
 * 3、使用服务的方法完成操作
 *
 * @author lshaci
 * @since 1.0.0
 */
public class HelloWorld {

    // 1.创建核心对象

    /**
     * 2.发布流程
     */
    @Test
    public void deployProcess() {
        // 1.根据需要，获取对应服务
        RepositoryService repositoryService = ProcessEngineSingleton.singleton.repositoryService();
        // 2.使用服务的方法，完成操作
        // 2.1、创建发布配置对象
        DeploymentBuilder deploymentBuilder = repositoryService.createDeployment();
        // 2.2、做配置
        deploymentBuilder
                .addClasspathResource("HelloWorld.bpmn")
                .addClasspathResource("HelloWorld.png");
        // 2.3、应用配置
        Deployment deployment = deploymentBuilder.deploy();
        System.err.println(deployment);
    }

    /**
     * 3.（按照规则）启动流程
     */
    @Test
    public void startProcess() {
        // 1.根据需要，获取对应服务
        RuntimeService runtimeService = ProcessEngineSingleton.singleton.runtimeService();
        // 2.使用服务的方法，完成操作
        String processDefinitionKey = "HelloWorld";
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey);
        // 2501
        System.err.println(processInstance);
    }

    /**
     * 4.查看任务
     */
    @Test
    public void queryTask() {
        // 1.根据需要，获取对应服务
        TaskService taskService = ProcessEngineSingleton.singleton.taskService();
        String assignee;
        List<Task> tasks;
        // 2.使用服务的方法，完成操作
        assignee = "小强";
        tasks = taskService.createTaskQuery().taskAssignee(assignee).list();
        System.err.println("==========【" + assignee + "】的任务列表==========");
        // Task[id=2505, name=员工请假]
        tasks.forEach(System.err::println);

        assignee = "小强经理";
        tasks = taskService.createTaskQuery().taskAssignee(assignee).list();
        System.err.println("==========【" + assignee + "】的任务列表==========");
        // Task[id=5002, name=经理审批]
        tasks.forEach(System.err::println);
    }

    /**
     * 5.办理任务
     */
    @Test
    public void completeTask() {
        // 1.根据需要，获取对应服务
        TaskService taskService = ProcessEngineSingleton.singleton.taskService();
        // 2.使用服务的方法，完成操作
        String taskId;
//        taskId = "2505";
//        taskService.complete(taskId);

        taskId = "5002";
        taskService.complete(taskId);

        queryTask();
    }

    /**
     * 获取任务出口
     */
    @Test
    public void getOutGoingTransNames() {
        List<String> outGoingTransNames = ProcessEngineSingleton.singleton.getOutGoingTransNames("2505");
        System.err.println(outGoingTransNames);
    }
}
